package com.tiny.work.plane;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;

/**
 * Created by zhaolulun on 2018/5/31.
 *
 * @author zhaolulun
 * @date 2018/05/31
 */
public class DateUtils {

    /**
     * 增加日期的天数。失败返回null。
     *
     * @param date      日期
     * @param dayAmount 增加数量。可为负数
     * @return 增加天数后的日期
     */
    public static Date addDay(Date date, int dayAmount) {
        Date myDate = null;
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.DAY_OF_MONTH, dayAmount);
            myDate = calendar.getTime();
        }
        return myDate;
    }

    /**
     * 增加或减少日期的分钟。失败返回null。
     *
     * @param date         日期
     * @param minuteAmount 增加数量。可为负数
     * @return 增加天数后的日期
     */
    public static Date addMinutes(Date date, int minuteAmount) {
        Date myDate = null;
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.MINUTE, minuteAmount);
            myDate = calendar.getTime();
        }
        return myDate;
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     *
     * @param date     日期字符串
     * @param parttern 日期格式
     * @return 日期
     */
    public static Date StringToDate(String date, String parttern) {
        Date myDate = null;
        if (date != null) {
            try {
                myDate = getDateFormat(parttern).parse(date);
            } catch (Exception e) {
            }
        }
        return myDate;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     *
     * @param date     日期
     * @param parttern 日期格式
     * @return 日期字符串
     */
    public static String DateToString(Date date, String parttern) {
        String dateString = null;
        if (date != null) {
            try {
                dateString = getDateFormat(parttern).format(date);
            } catch (Exception e) {
            }
        }
        return dateString;
    }

    /**
     * 获取SimpleDateFormat
     *
     * @param parttern 日期格式
     * @return SimpleDateFormat对象
     * @throws RuntimeException 异常：非法日期格式
     */
    private static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException {
        return new SimpleDateFormat(parttern);
    }


    /**
     * @param date1 日期
     * @param date2 另一个日期
     * @return 相差天数
     */
    public static int daysBetween(Date date1, Date date2) {
        ZoneId zoneId = ZoneId.systemDefault();
        Instant instant = date1.toInstant();
        LocalDateTime localDateTime1 = instant.atZone(zoneId).toLocalDateTime();
        Instant instant2 = date2.toInstant();
        LocalDateTime localDateTime2 = instant2.atZone(zoneId).toLocalDateTime();

        return (int) Math.abs(Duration.between(localDateTime1, localDateTime2).toDays());
    }

    /**
     * 两个时间的差值，后面减去前面的时间
     *
     * @param startDate
     * @param endDate
     * @return
     */
    public static int twoDaysBetween(Date startDate, Date endDate) {
        ZoneId zoneId = ZoneId.systemDefault();
        Instant instant = startDate.toInstant();
        LocalDateTime localDateTime1 = instant.atZone(zoneId).toLocalDateTime();
        Instant instant2 = endDate.toInstant();
        LocalDateTime localDateTime2 = instant2.atZone(zoneId).toLocalDateTime();

        return (int) Duration.between(localDateTime1, localDateTime2).toDays();
    }

    public static Date getNowDay(Date date) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date);
        // 将时分秒,毫秒域清零
        cal1.set(Calendar.HOUR_OF_DAY, 0);
        cal1.set(Calendar.MINUTE, 0);
        cal1.set(Calendar.SECOND, 0);
        cal1.set(Calendar.MILLISECOND, 0);
        return cal1.getTime();
    }

    /**
     * LocalDate 类型转 Date 类型
     *
     * @param localDate LocalDate 类型时间
     * @return 日期
     */
    public static Date LocalDateToDate(LocalDate localDate) {
        localDate = localDate == null ? LocalDate.now() : localDate;
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
        return Date.from(instant);
    }

    /**
     * Date 类型转 LocalDate 类型
     *
     * @param date Date 类型时间
     * @return 日期
     */
    public static LocalDate DateToLocalDate(Date date) {
        date = date == null ? new Date() : date;
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        return instant.atZone(zoneId).toLocalDate();
    }

    /**
     * localDateTime 类型转 Date 类型
     *
     * @param localDateTime 指定日期
     * @return 日期
     */
    public static Date LocalDateTimeToDate(LocalDateTime localDateTime) {
        localDateTime = localDateTime == null ? LocalDateTime.now() : localDateTime;
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDateTime.atZone(zone).toInstant();
        return Date.from(instant);
    }
    private static final Pattern TIMESTAMP_PATTERN = Pattern.compile("^[\\d]+$");

    public static Date toDate(String dateStr) {
        if (TIMESTAMP_PATTERN.matcher(dateStr).matches()) {
            return new Date(Long.parseLong(dateStr));
        } else {
            try {
                return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)).parse(dateStr);
            } catch (ParseException var2) {
                throw new RuntimeException(var2);
            }
        }
    }

    public static String toString(Date date) {
        return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)).format(date);
    }
}
